home *** CD-ROM | disk | FTP | other *** search
/ Aminet 34 / Aminet 34 (2000)(Schatztruhe)[!][Dec 1999].iso / Aminet / util / wb / THE.lha / T.H.E. / REXX / OS3.5 / IconSorter.rexx < prev    next >
Encoding:
OS/2 REXX Batch file  |  1999-10-27  |  6.7 KB  |  275 lines

  1. /*
  2.    $VER: IconSorter.rexx 0.9 (20.10.99) Copyright (c) by Nils Görs
  3.  
  4.  
  5.    This script sorts icons in alphabetical order. It will check for
  6.    Icon weight and height, supports space between icons etc.pp.
  7.  
  8.  
  9. This script needs following arexx-libraries:
  10.     - rexxreqtools.library
  11.     - rexxtricks.library
  12.     - rexxdossupport.library
  13.  
  14.  
  15.    Template: ORDER/M/K,SPACEX/N/K,SPACEY/N/K,SAMEHEIGHT/S,NAMECHECK/S
  16.  
  17.  Parameters: ORDER    = TOOL , DRAWER , PROJECT
  18.  
  19.          SPACEX    = number of pixel between horizontal icons.
  20.          SPACEY    = number of pixel between vertical icons.
  21.          SAMEHEIGHT = if set all icons will have the same height.
  22.          NAMECHECK    = will check the width of the Iconname and use it.
  23.  
  24.     Example: IconSorter.rexx ORDER=TOOL PROJECT DRAWER SPACEX=20
  25.  
  26.              Will sort the icons in following order: TOOL PROJECT DRAWER         
  27.          The space between two horizontal icons will be 20 pixels.
  28. */
  29.  
  30. spacex = 5            /* x pixel between horizontal icons */
  31. spacey = 3            /* x pixel between vertical icons */
  32.  
  33. posxstart = 18            /* start x position */
  34. posystart = 10            /* start y position */
  35.  
  36. fontheight = 13            /* standard value */
  37.  
  38. SameHeight = "No"        /* If "Yes" the largest icon will be used for position calculation. */
  39. NameCheck  = "No"        /* If "Yes" the width from Iconname will be used. */
  40.  
  41. /* Please do not change anything under this line  */
  42. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  43. NL = '0a'x
  44. options results
  45.  
  46. PARSE ARG input
  47.  
  48. ADDRESS WORKBENCH
  49.  
  50. /* Check workbench.library version */
  51. minversion = "44.1226"
  52. GETATTR APPLICATION.VERSION
  53. wbversion = result
  54. IF wbversion < minversion THEN DO
  55.     call rtezrequest("You are using workbench.library v"||wbversion||NL||"This scripts needs workbench.library v"||minversion||" or higher","_Thanks","IconSorter.rexx",)
  56.     EXIT
  57. END
  58.  
  59. GETATTR OBJECT WINDOWS.ACTIVE
  60. activeWin = result
  61.  
  62. GETATTR OBJECT WINDOW.ICONS.ALL.COUNT NAME activeWin
  63. numofIcons = result
  64.  
  65. If numofIcons = 0 THEN EXIT
  66.  
  67. CALL _InitAll
  68.  
  69. /* write all icon informations in a seperate
  70. ** variable and get the max size from an icon.
  71. */
  72. maxiconheight = 0
  73. maxiconwidth = 0
  74.  
  75. do i = 0 to numofIcons-1
  76.     GETATTR OBJECT WINDOW.ICONS.ALL.i NAME activeWin STEM IconInfo.i
  77.         IF maxiconheight < IconInfo.i.height THEN maxiconheight = IconInfo.i.height
  78.         IF maxiconwidth < IconInfo.i.width THEN maxiconwidth = IconInfo.i.width
  79.     IF NameCheck = "YES" THEN DO
  80.     GETATTR APPLICATION.FONT.SCREEN.SIZE NAME '"'||IconInfo.i.name||'"'    /* check the wide from iconname */
  81.         IF result > maxiconwidth then maxiconwidth = result
  82.     END
  83. end
  84.  
  85. /* sorting icons */
  86. d = 0
  87. t = 0
  88. p = 0
  89. do i = 0 to numofIcons-1
  90.     SELECT
  91.         WHEN IconInfo.i.type = "DRAWER" THEN DO
  92.             d = d +1
  93.             drawerVar.d = i
  94.         END
  95.         WHEN IconInfo.i.type = "TOOL" THEN DO
  96.             t = t +1
  97.             toolVar.t = i
  98.         END
  99.         WHEN IconInfo.i.type = "PROJECT" THEN DO
  100.             p = p +1
  101.             projectVar.p = i
  102.         END
  103.  
  104.     OTHERWISE
  105.         NOP
  106.     END
  107. end
  108.  
  109. DrawerVar.0 = d
  110. ToolVar.0 = t
  111. ProjectVar.0 = p
  112.  
  113. /* how many icons per row? */
  114. GETATTR OBJECT WINDOW.HEIGHT NAME activeWin
  115. winheight = result
  116.  
  117.     iconfont = maxiconheight + fontheight + spacey        /* icon + font height */
  118.     winheight2 = winheight-posystart
  119.  
  120.     IconsPerRow=TRUNC((winheight2/iconfont)-0.5)        /* how many Icons per row? */
  121.  
  122.     IF IconsPerRow <=0 THEN IconsPerRow = 1
  123.  
  124. /*
  125. ** If the user does not specified an sort order,
  126. **  standard-order will be used instead.
  127. */
  128. IF order.count ~= 0 THEN DO
  129.     do o = 0 to order.count-1
  130.             IF order.o = "TOOL"    THEN CALL SortTools
  131.             IF order.o = "DRAWER"  THEN CALL SortDrawers
  132.             IF order.o = "PROJECT" THEN CALL SortProject
  133.     end
  134. END
  135.     ELSE DO
  136.         CALL SortDrawers
  137.         CALL SortTools 
  138.         CALL SortProject
  139.     END
  140.     erg=rtezrequest("Resize window?","_Yes|_No","IconSorter.rexx",)
  141.     IF erg = 1 THEN MENU INVOKE WINDOW.RESIZETOFIT
  142.  
  143. IF changes ~= 0 THEN DO        /* any changes to the window? */
  144.     Erg=rtezrequest("Save changes to disk?","_Yes|_No","IconSorter.rexx",)
  145.     IF erg = 1 THEN MENU WINDOW '"'||activeWin||'"' INVOKE WINDOW.SNAPSHOT.ALL
  146. END
  147. EXIT
  148.  
  149. /* subroutines */
  150. SortDrawers:
  151. IF drawervar.0 = 0 THEN RETURN
  152.  
  153. /* create a dump variable <Iconname> <Position> */
  154. do i = 1 to drawervar.0
  155.     e = drawervar.i
  156.     drawervar2.i = IconInfo.e.name e
  157.  
  158. end
  159. drawervar2.0 = drawervar.0
  160. CALL RXTR_QSORT(drawervar2,sortedvar,NOCASE,,)
  161.  
  162. CALL SetIcons
  163. RETURN
  164.  
  165. SortTools:
  166. IF toolvar.0 = 0 THEN RETURN
  167.  
  168. /* create a dump variable <Iconname> <Position> */
  169. do i = 1 to toolvar.0
  170.     e = toolvar.i
  171.     toolvar2.i = IconInfo.e.name e
  172. end
  173. toolvar2.0 = toolvar.0
  174. CALL RXTR_QSORT(toolvar2,sortedvar,NOCASE,,)
  175.  
  176. CALL SetIcons
  177. RETURN
  178.  
  179.  
  180. SortProject:
  181. IF Projectvar.0 = 0 THEN RETURN
  182.  
  183. /* create a dump variable <Iconname> <Position> */
  184. do i = 1 to Projectvar.0
  185.     e = Projectvar.i
  186.     Projectvar2.i = IconInfo.e.name e
  187. end
  188. Projectvar2.0 = Projectvar.0
  189. CALL RXTR_QSORT(Projectvar2,sortedvar,NOCASE,,)
  190.  
  191. CALL SetIcons
  192. RETURN
  193.  
  194.  
  195. /* This routine is to position all icons */
  196. SetIcons:
  197. LOCKGUI
  198.  
  199. do i = 1 to sortedvar.0
  200.     IF r < IconsPerRow THEN DO
  201.         r = r + 1
  202.         anz=WORDS(sortedvar.i)                /* how man words? <Iconname> <Pos> */
  203.         e = WORD(sortedvar.i,anz)            /* get Index.<Pos> of Icon */
  204.         IconName = SUBWORD(sortedvar.i,1,anz-1)
  205.  
  206.         ICON WINDOW activeWin '"'||IconName||'"' X posx Y posy
  207.  
  208.         IF SameHeight = "YES" THEN posY = posY + spaceY + maxiconheight + fontheight
  209.             ELSE DO
  210.                 posy = spacey+posy+IconInfo.e.height+fontheight    /* calculate new position */
  211.                 h = i+1
  212.  
  213.                 IF h > sortedvar.0 THEN NOP
  214.                     ELSE DO
  215.                         anz2=WORDS(sortedvar.h)                /* how man words? <Iconname> <Pos> */
  216.                         f = WORD(sortedvar.h,anz2)            /* get Index.<Pos> of Icon */
  217.                         spaceNeed = posy+spacey+IconInfo.f.height+fontheight
  218.                         IF r = IconsPerRow THEN
  219.                             IF winheight > spaceneed THEN DO
  220.                                 spaceNeed = IconInfo.f.height+fontheight+posystart
  221.                                 IF SpaceNeed+posy < winheight THEN r = r-1
  222.                             END
  223.                     END
  224.             END
  225.     END
  226.     ELSE DO                        /* next ROW */
  227.         i = i - 1
  228.         posy = posystart
  229.         r = 0
  230.         posx = posx + maxiconwidth + spacex
  231.     END
  232. end
  233. UNLOCKGUI
  234. changes = 1
  235. RETURN
  236.  
  237. _InitAll:
  238.  
  239. changes = 0            /* var to check if something changed */
  240. posx = posxstart
  241. posy = posystart
  242. r = 0                /* row counter */
  243.  
  244. Template = "ORDER/M/K,SPACEX/N/K,SPACEY/N/K,SAMEHEIGHT/S,NAMECHECK/S"
  245.  
  246.    /*
  247.    ** Open libs
  248.    */
  249.  
  250.    IF ~SHOW(LIBRARIES,'rexxtricks.library') THEN
  251.       IF ~ADDLIB('rexxtricks.library',9,-30,38) THEN
  252.          quit('Cannot open rexxtricks.library!',10)
  253.  
  254.    IF ~SHOW('LIBRARIES','rexxreqtools.library') THEN
  255.       IF ~ADDLIB('rexxreqtools.library',9,-30,0) THEN
  256.          quit('Cannot open rexxreqtools.library!',10)
  257.  
  258.    IF ~SHOW('LIBRARIES','rexxdossupport.library') THEN
  259.       IF ~ADDLIB('rexxdossupport.library',9,-30,0) THEN
  260.          quit('Cannot open rexxdossupport.library!',10)
  261.  
  262. GETATTR APPLICATION.FONT.SCREEN.HEIGHT
  263. fontheight = result
  264.  
  265.  
  266.     order.count = 0
  267. IF input ~= "" THEN DO
  268.     call ReadArgs(input,Template)
  269.     IF sameheight = 1 THEN SameHeight = "yes"
  270.     IF NameCheck  = 1 THEN NameCheck = "yes"
  271. END
  272. SameHeight = UPPER(SameHeight)
  273. NameCheck= UPPER(NameCheck)
  274. RETURN
  275.